#ifndef _WIFI_CONFIG_H_
#define _WIFI_CONFIG_H_

#include "public.h"


#include "lwip/err.h"
#include "lwip/sys.h"
#include "esp_http_server.h"
#include "esp_netif.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include <inttypes.h>  // 用于PRId32等格式宏
#include "lwip/dns.h"
#include "esp_wifi.h" 
#include "public.h"
#include "esp_app_format.h" 
#include "esp_mac.h" // 添加头文件
#include "freertos/event_groups.h"



// 修改事件组定义
#define WIFI_CONNECTED_BIT BIT0     // sta模式 连接ap 
#define WIFI_AP_START_BIT  BIT1     // ap模式开始
#define WIFI_AP_STOP_BIT   BIT2     // ap模式结束
#define WIFI_PROV_MODE_BIT BIT3     // 进入配网 ap模式

#define AP_START_TIMEOUT_MS 8000  // 延长至8秒
#define TCP_SEND_INTERVAL_MS 500  // 数据发送间隔

#define NVS_NAMESPACE      "sys_cfg"
#define WIFI_SSID_KEY      "w_ssid"
#define WIFI_PASS_KEY      "w_pass"
#define SERVER_IP_KEY      "srv_ip"
#define SERVER_PORT_KEY    "srv_port"
#define MAX_RETRY_COUNT    5
#define PROV_TIMEOUT_FIRST 5
#define PROV_TIMEOUT_RETRY 5
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define MAX_RETRY_DELAY_MS 60000
#define INITIAL_RETRY_DELAY_MS 1000
#define HEARTBEAT_INTERVAL_MS 3000

#define CLOSE_SOCKET(sock) do { \
    shutdown(sock, SHUT_RDWR); \
    close(sock); \
    ESP_LOGD(TAG, "Socket %d 已关闭", sock); \
} while(0)

typedef struct
{
    TaskHandle_t tcp_task_handle;
    esp_timer_handle_t prov_timer;          // 确保已声明
    EventGroupHandle_t wifi_event_group;
    httpd_handle_t server;
}WIFICONFIGHANDLE; 

typedef struct {
    char ssid[32];
    char pass[64];
    char ip[16];
    int32_t port;
} app_config_t;


typedef struct
{
    uint8_t retry_count;
    int connected_sta_count;  // 当前连接的STA设备数量
    int remaining_prov_time;  // 剩余配网时间（秒）
    app_config_t g_config;
    WIFICONFIGHANDLE handle;

}WIFICONFIG;

extern WIFICONFIG gs_wificonfig;
extern char SoftWifiName[32]; // 初始化 SSID
extern char SoftWifiPass[64]; // 初始化密码

/* 函数前置声明 */
void start_provisioning(int timeout);
void start_sta_mode(void);
void prov_timeout_cb(void* arg);
esp_err_t init_nvs(void);
esp_err_t load_config(app_config_t *cfg);
esp_err_t save_config(const app_config_t *cfg);
const char* disconnect_reason(uint8_t reason);
void tcp_client_task(void *pvParameters);
bool is_valid_config(const app_config_t *cfg);
void connection_monitor_task(void *arg);
void clear_network_interfaces(void);  // 原缺失static声明
esp_err_t config_handler(httpd_req_t *req);
void wifi_event_handler(void* arg, esp_event_base_t base, int32_t id, void* data);

void Wifi_Init(void);
#endif
